home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-30 | 21.4 KB | 711 lines | [TEXT/KAHL] |
- // Spritez.c
- // by Stefan C. Sinclair Copyright © 1995-1996 All rights reserved.
-
- #include "SpriteError.h"
- #include "Spritez.h"
- #include "Application.h"
- #include "SpriteFile.h"
-
- extern CWindowPtr gWindowP;
- extern SndChannelPtr gSoundChanP1, gSoundChanP2, gSoundChanGame;
- extern short gFrameAdvanceTime;
- extern short gPlayer1Controller, gPlayer2Controller;
- extern SpriteFileRec gPlayer1File, gPlayer2File;
- extern CombatZoneFileRec gCombatZoneFile;
- extern Point player1TopLeft;
- extern Point player2TopLeft;
- extern SpriteGameRec spriteGame;
- extern Boolean gSecretCode[kNumSecretCodes];
-
- Handle gP1SoundH[kNumSpriteSounds], gP2SoundH[kNumSpriteSounds];
- Handle musicH;
- RgnHandle gWorkRgn;
- short gWinnerSprite;
- short gSpriteHeight, gSpriteWidth;
- short gPICTFileRefNum;
- SpriteGameRec spriteGame;
- Rect gPlayer1DamageRect, gPlayer2DamageRect;
-
- OSErr CombatCommand(Boolean *player1Victorious)
- {
- unsigned long ticks, startTicks;
- long seconds, oldSeconds;
- OSErr err = noErr;
- short i, combatRoundTime;
- Rect timeRect;
- Str255 timeStr;
- SpritePtr backgroundSprite;
- Boolean haveEvent;
- EventRecord event;
-
- // Some initializations
- FlushEvents(everyEvent, 0);
- InitSoundChannel(&gSoundChanP1);
- InitSoundChannel(&gSoundChanP2);
- InitSoundChannel(&gSoundChanGame);
- gWorkRgn = NULL;
- gSpriteHeight = 128;
- gSpriteWidth = 128;
- gPlayer1DamageRect.top = kLifeRectTop;
- gPlayer1DamageRect.bottom = kLifeRectBottom;
- gPlayer1DamageRect.left = kP1LifeRectLeft + kSpriteLife; // zero damage
- gPlayer1DamageRect.right = kP1LifeRectRight;
- gPlayer2DamageRect.top = kLifeRectTop;
- gPlayer2DamageRect.bottom = kLifeRectBottom;
- gPlayer2DamageRect.left = kP2LifeRectLeft + kSpriteLife; // zero damage
- gPlayer2DamageRect.right = kP2LifeRectRight;
-
- // Here we go.
- // Play a movie! Yay!
- //PlaySpriteMovie(gCombatZoneFile);
- // Create the players
- gWinnerSprite = -1; // No winner yet.
- // •••••••••••••••••••••••••••••••• Create sprite world
- StartWaiting();
- err = CreateSpriteGame(&spriteGame);
- if(err != noErr)
- {
- DoError(kCouldNotCreateSprites, FALSE);
- StopWaiting();
- return err;
- }
-
- StopWaiting();
-
- timeRect.top = kTimeRectTop;
- timeRect.left = kTimeRectLeft;
- timeRect.bottom = kTimeRectBottom;
- timeRect.right = kTimeRectRight;
-
- // Begin!
- if((**spriteGame.spriteWorldP->backFrameP->framePort.colorGrafP->portPixMap).pixelSize != 8)
- {
- DoError(kNeedMonitor256Colors, FALSE);
- }
- HideCursor();
- SWLockSpriteWorld(spriteGame.spriteWorldP);
- SWUpdateSpriteWorld(spriteGame.spriteWorldP);
- ticks = 0;
- seconds = oldSeconds = 0;
- startTicks = TickCount();
- combatRoundTime = (gSecretCode[kDoubleTimeCode] ?
- (2*kNumberOfSecondsPerRound) : kNumberOfSecondsPerRound);
- NumToString((combatRoundTime - seconds), timeStr);
- DRAW_TIME
- while(ticks < (60 * combatRoundTime))
- {
- /*** Draw Elapsed Time ***/
- ticks = TickCount() - startTicks;
- seconds = ticks / 60;
- if(seconds != oldSeconds)
- {
- oldSeconds = seconds;
- NumToString((kNumberOfSecondsPerRound - seconds), timeStr);
- DRAW_TIME
- }
- SWCollideSpriteLayer(spriteGame.playerLayerP, spriteGame.playerLayerP);
- SWProcessSpriteWorld(spriteGame.spriteWorldP);
- SWAnimateSpriteWorld(spriteGame.spriteWorldP);
- // Music
- if(!gSecretCode[kNoBGMusicCode])
- LoopSound(musicH, gSoundChanGame);
- // Uncomment to let menu clock update!
- //haveEvent = WaitNextEvent(everyEvent, &event, 0, NULL);
- if(gWinnerSprite >= 0)
- goto BATTLE_IS_OVER; // This will make sure we kick out of the loop!
- }
- BATTLE_IS_OVER:
- // Turn off the music
- if(!gSecretCode[kNoBGMusicCode])
- StopPlayingSound(gSoundChanGame);
-
- SWUnlockSpriteWorld(spriteGame.spriteWorldP);
- // Did both sprites survive the battle?
- if(gWinnerSprite < 0)
- {
- gWinnerSprite = DetermineWinner(spriteGame.spriteWorldP);
- SpriteFuneral(gWinnerSprite);
- }
- else
- SpriteFuneral(gWinnerSprite);
- // Tell the caller who won
- switch(gWinnerSprite)
- {
- case kPlayer1Sprite:
- case kComputer1Sprite:
- *player1Victorious = TRUE;
- break;
- default:
- *player1Victorious = FALSE;
- break;
- }
- // Clean up 'internal' memory
- DISPOSAL:
- ShowCursor();
- MyDisposeSpriteGame(&spriteGame);
- // Dispose of music
- if(!gSecretCode[kNoBGMusicCode])
- {
- HUnlock(musicH);
- DisposeHandle(musicH);
- }
-
- err = MemError();
- if(err != noErr)
- DoError(kGeneralMemoryError, TRUE);
-
- // Mark window for update
- InvalRect(&gWindowP->portRect);
-
- // Kill Sound Channels
- KillSoundChannel(&gSoundChanP1);
- KillSoundChannel(&gSoundChanP2);
- KillSoundChannel(&gSoundChanGame);
-
- // reset secret code flags
- for(i=0; i<kNumSecretCodes; i++)
- gSecretCode[i] = FALSE;
-
- FlushEvents(everyEvent, 0);
- return err;
- }
-
- OSErr CreateSpriteGame(SpriteGamePtr gamePtr)
- {
- OSErr err = noErr;
- SpritePtr spriteArray[kNumberOfSprites];
- short i, foregroundSpriteID, backgroundSpriteID;
- short oldResRefNum, curResRefNum, gPICTFileRefNum;
- Rect worldRect, hourGlassRect, damageRect;
- unsigned char *spriteDataPtr; // use as an array of 8 u. chars.
- PicHandle BackGroundPict, timePict;
- CQDProcsPtr savedProcs;
- CQDProcs myProcs; /*use CQDProcs for a color window*/
- long longCount,myEOF,filePos;
- QDPutPicUPP myGetPICTProc;
-
- gWorkRgn = NewRgn();
- SetPort((GrafPtr)gWindowP);
- worldRect = gWindowP->portRect;
-
- if (err == noErr)
- err = SWEnterSpriteWorld();
- if (err == noErr)
- // create the sprite world
- err = SWCreateSpriteWorldFromWindow(&gamePtr->spriteWorldP, gWindowP, NULL);
- if (err == noErr)
- {
- // create the sprite layers
- err = SWCreateSpriteLayer(&gamePtr->playerLayerP);
- if(err == noErr)
- err = SWCreateSpriteLayer(&gamePtr->backgroundLayerP);
- if(err == noErr)
- err = SWCreateSpriteLayer(&gamePtr->foregroundLayerP);
- }
-
- if (err == noErr)
- {
- // Load Background music
- oldResRefNum = CurResFile();
- curResRefNum = HOpenResFile(gCombatZoneFile.sfFile.vRefNum,
- gCombatZoneFile.sfFile.parID,gCombatZoneFile.sfFile.name,
- fsRdPerm);
- err = ((ResError()!=noErr) || curResRefNum < 0);
-
- UseResFile(curResRefNum);
- if(!gSecretCode[kNoBGMusicCode])
- {
- musicH = Get1Resource('snd ', kBGMusicResID);
- if(musicH == NULL)
- gSecretCode[kNoBGMusicCode] = TRUE; // no music!
- else
- {
- DetachResource(musicH);
- MoveHHi(musicH);
- HLock(musicH);
- }
- }
- CloseResFile(curResRefNum);
- UseResFile(oldResRefNum);
-
- // Get Background PICT
- err = FSpOpenDF(&gCombatZoneFile.sfFile, fsRdPerm,&gPICTFileRefNum);
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- else
- err = GetEOF(gPICTFileRefNum,&myEOF); // get EOF for later check
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- else
- err = SetFPos(gPICTFileRefNum,fsFromStart,512);//skip header
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- // read in the (obsolete) size word and the picFrame
- longCount = myEOF - 512;
- BackGroundPict = (PicHandle)NewHandleClear(longCount);
- if(BackGroundPict != NULL)
- HLock((Handle)BackGroundPict);
- else
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- err = FSRead(gPICTFileRefNum,&longCount,(Ptr)*BackGroundPict);
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- HUnlock((Handle)BackGroundPict);
- err = GetFPos(gPICTFileRefNum,&filePos); // get position for check
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- err = FSClose(gPICTFileRefNum);
- if(err != noErr)
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- //Check for errors. if there wasn't enough room,
- //DrawPicture will abort; the FILE position mark
- //won't be at the end of the FILE.
- if(filePos != myEOF)
- {
- DoError(kCouldNotCreateBackGroundSprite, FALSE);
- err = 1;
- }
- }
-
- // •••••••••••••••••••••••••••••••• Create player 1 sprite
- if (err == noErr)
- {
- oldResRefNum = CurResFile();
- curResRefNum = HOpenResFile(gPlayer1File.sfFile.vRefNum,
- gPlayer1File.sfFile.parID,gPlayer1File.sfFile.name,
- fsRdPerm);
- err = ((ResError()!=noErr) || curResRefNum < 0);
- }
- if (err == noErr) // Here, sprite is actually created
- {
- // create player 1 sprite
- UseResFile(curResRefNum);
- // PICT sprites
- // The Warrior
- err = SWCreateSpriteFromPictResource(&spriteArray[kPlayer1Sprite],
- &gamePtr->spriteArray[kPlayer1Sprite],kFirstSpriteResNum, (kFirstSpriteResNum+kMaskFrameOffset),
- kNumberOfWarriorFrames,kRegionMask);
- // ... and the projectile
- if(err == noErr && !gSecretCode[kNoProjectileCode])
- err = SWCreateSpriteFromPictResource(&spriteArray[kPlayer1ProjectileSprite],
- &gamePtr->spriteArray[kPlayer1ProjectileSprite],kFirstProjectileResNum, (kFirstProjectileResNum+kMaskFrameOffset),
- kNumberOfProjectileFrames,kRegionMask);
-
- // Get sounds
- if(err == noErr)
- {
- for(i=0; i<kNumSpriteSounds; i++)
- {
- gP1SoundH[i] = Get1Resource('snd ', i+kFirstSoundResID);
- if(gP1SoundH[i] == NULL)
- CantFindResource();
- DetachResource(gP1SoundH[i]);
- MoveHHi(gP1SoundH[i]);
- HLock(gP1SoundH[i]);
- }
- }
-
- CloseResFile(curResRefNum);
- UseResFile(oldResRefNum);
- }
- else
- {
- DoError(kCouldNotCreatePlayer1Sprite, FALSE);
- // dispose memory later.
- }
-
- // •••••••••••••••••••••••••••••••• Create player 2 sprite
- if (err == noErr)
- {
- oldResRefNum = CurResFile();
- curResRefNum = HOpenResFile(gPlayer2File.sfFile.vRefNum,
- gPlayer2File.sfFile.parID,gPlayer2File.sfFile.name,
- fsRdPerm);
- err = ((ResError()!=noErr)|| curResRefNum < 0);
- }
- if (err == noErr) // Here, sprite is actually created
- {
- // create player 2 sprite
- UseResFile(curResRefNum);
- // PICT sprites
- // The Warrior
- err = SWCreateSpriteFromPictResource(&spriteArray[kPlayer2Sprite],
- &gamePtr->spriteArray[kPlayer2Sprite],kFirstSpriteResNum, (kFirstSpriteResNum+kMaskFrameOffset),
- kNumberOfWarriorFrames,kRegionMask);
- // ... and the projectile
- if(err == noErr && !gSecretCode[kNoProjectileCode])
- err = SWCreateSpriteFromPictResource(&spriteArray[kPlayer2ProjectileSprite],
- &gamePtr->spriteArray[kPlayer2ProjectileSprite],kFirstProjectileResNum, (kFirstProjectileResNum+kMaskFrameOffset),
- kNumberOfProjectileFrames,kRegionMask);
-
- // Get sounds
- if(err == noErr)
- {
- for(i=0; i<kNumSpriteSounds; i++)
- {
- gP2SoundH[i] = Get1Resource('snd ', i+kFirstSoundResID);
- if(gP2SoundH[i] == NULL)
- CantFindResource();
- DetachResource(gP2SoundH[i]);
- MoveHHi(gP2SoundH[i]);
- HLock(gP2SoundH[i]);
- }
- }
-
- CloseResFile(curResRefNum);
- UseResFile(oldResRefNum);
- }
- else
- {
- DoError(kCouldNotCreatePlayer1Sprite, FALSE);
- // dispose memory later.
- }
-
- // Add background sprite if the secret code is activated
- if(err == noErr && gSecretCode[kBGAnimationCode])
- {
- backgroundSpriteID = GetRandom(kFirstBackgroundSpriteID,kLastBackgroundSpriteID);
- err = CreateBackgroundSprite(&gamePtr->spriteArray[kBackgroundSprite], backgroundSpriteID);
- }
-
- // Add foreground sprite if the secret code is activated
- if(err == noErr && gSecretCode[kFGAnimationCode])
- {
- foregroundSpriteID = GetRandom(kFirstForegroundSpriteID,kLastForegroundSpriteID);
- err = CreateForegroundSprite(&gamePtr->spriteArray[kForegroundSprite], foregroundSpriteID);
- }
-
- if (err == noErr)
- {
- // Add sprites to layers
- SWAddSprite(gamePtr->playerLayerP, &gamePtr->spriteArray[kPlayer1Sprite]);
- SWAddSprite(gamePtr->playerLayerP, &gamePtr->spriteArray[kPlayer2Sprite]);
- SWAddSprite(gamePtr->playerLayerP, &gamePtr->spriteArray[kPlayer1ProjectileSprite]);
- SWAddSprite(gamePtr->playerLayerP, &gamePtr->spriteArray[kPlayer2ProjectileSprite]);
- if(gSecretCode[kBGAnimationCode])
- SWAddSprite(gamePtr->backgroundLayerP,&gamePtr->spriteArray[kBackgroundSprite]);
- if(gSecretCode[kFGAnimationCode])
- SWAddSprite(gamePtr->foregroundLayerP,&gamePtr->spriteArray[kForegroundSprite]);
-
- // Add the layers to the world
- SWAddSpriteLayer(gamePtr->spriteWorldP, gamePtr->backgroundLayerP);
- SWAddSpriteLayer(gamePtr->spriteWorldP, gamePtr->playerLayerP);
- SWAddSpriteLayer(gamePtr->spriteWorldP, gamePtr->foregroundLayerP);
-
- SetupSpriteGame(gamePtr);
- if(gSecretCode[kBGAnimationCode])
- SetupBackgroundSprite(&gamePtr->spriteArray[kBackgroundSprite], backgroundSpriteID);
- if(gSecretCode[kFGAnimationCode])
- SetupForegroundSprite(&gamePtr->spriteArray[kForegroundSprite], foregroundSpriteID);
-
- // Do initial drawing to the background
- SWSetPortToBackGround(gamePtr->spriteWorldP);
- // Now Draw the Background PICT
- HLock((Handle)BackGroundPict);
- DrawPicture(BackGroundPict, &gWindowP->portRect);
- HUnlock((Handle)BackGroundPict);
- DisposeHandle((Handle)BackGroundPict);
-
- if(err == noErr)
- {
- // Draw hour glass
- hourGlassRect.top = kHourGlassTop;
- hourGlassRect.left = kHourGlassLeft;
- hourGlassRect.bottom = kHourGlassBottom;
- hourGlassRect.right = kHourGlassRight;
- timePict = GetPicture(kHourGlassPICTResID);
- if(timePict == nil)
- CantFindResource();
- HLock((Handle)timePict);
- DrawPicture(timePict, &hourGlassRect);
- HUnlock((Handle)timePict);
- ReleaseResource((Handle)timePict);
- // Frame the damage Rects, draw names
- ForeColor(magentaColor);
- BackColor(greenColor);
- TextFont(kDrawTimeTextFont);
- TextSize(12);
- TextFace(bold | italic);
- //Player 1
- damageRect.top = kLifeRectTop-2;
- damageRect.bottom = kLifeRectBottom+2;
- damageRect.left = kP1LifeRectLeft-2;
- damageRect.right = kP1LifeRectRight+2;
- EraseRect(&damageRect);
- MoveTo(damageRect.left,damageRect.top-2);
- DrawString(gPlayer1File.sfFile.name);
- // Player 2
- damageRect.left = kP2LifeRectLeft-2;
- damageRect.right = kP2LifeRectRight+2;
- EraseRect(&damageRect);
- MoveTo(damageRect.left,damageRect.top-2);
- DrawString(gPlayer2File.sfFile.name);
- // Reset the pens
- ForeColor(blackColor);
- BackColor(whiteColor);
- // Add white area to damage rects
- damageRect.top += 2;
- damageRect.bottom -= 2;
- //Player 1
- damageRect.left = kP1LifeRectLeft;
- damageRect.right = kP1LifeRectRight;
- EraseRect(&damageRect);
- //Player 2
- damageRect.left = kP2LifeRectLeft;
- damageRect.right = kP2LifeRectRight;
- EraseRect(&damageRect);
- // ... erase the time-rect - I just use damageRect for it here
- damageRect.top = kTimeRectTop;
- damageRect.left = kTimeRectLeft;
- damageRect.bottom = kTimeRectBottom;
- damageRect.right = kTimeRectRight;
- EraseRect(&damageRect);
- // plain text
- TextFace(0);
- }
- SWSetPortToWindow(gamePtr->spriteWorldP);
- }
-
- if (err != noErr)
- {
- MyDisposeSpriteGame(gamePtr);
- return err;
- }
-
- return err;
- }
-
- void MyDisposeSpriteGame(SpriteGamePtr spriteGameP)
- {
- SpriteLayerPtr curLayerP;
- SpritePtr curSpriteP;
- short i;
-
- if (gWorkRgn != NULL)
- DisposeRgn(gWorkRgn);
-
- if (spriteGameP != NULL)
- {
- if (spriteGameP->spriteWorldP != NULL)
- {
- SWUnlockSpriteWorld(spriteGameP->spriteWorldP);
-
- // dispose of each sprite in the layer
- while ((curLayerP = SWGetNextSpriteLayer(spriteGameP->spriteWorldP, NULL)) != NULL)
- {
- while ((curSpriteP = SWGetNextSprite(curLayerP, NULL)) != NULL)
- {
- SWRemoveSprite(curLayerP, curSpriteP);
- SWCloseSprite(curSpriteP); // Close, not dispose!
- }
-
- SWRemoveSpriteLayer(spriteGameP->spriteWorldP, curLayerP);
- SWDisposeSpriteLayer(curLayerP);
- }
- }
- if (spriteGameP->playerLayerP != NULL)
- {
- SWDisposeSpriteLayer(spriteGameP->playerLayerP);
- }
- if (spriteGameP->spriteWorldP != NULL)
- {
- SWDisposeSpriteWorld(spriteGameP->spriteWorldP);
- }
- }
- // Release sounds
- for(i=0; i<kNumSpriteSounds; i++)
- {
- HUnlock(gP1SoundH[i]);
- DisposeHandle(gP1SoundH[i]);
- HUnlock(gP2SoundH[i]);
- DisposeHandle(gP2SoundH[i]);
- }
-
- SWExitSpriteWorld();
- }
-
- ///--------------------------------------------------------------------------------------
- // SetupSpriteGame
- ///--------------------------------------------------------------------------------------
- short gMoveDelta = 0;
- void SetupSpriteGame(SpriteGamePtr gamePtr)
- {
- Rect tempBoundsRect, moveBoundsRect;
- short horizMoveDelta;
- short vertMoveDelta;
- short i;
- unsigned char *spriteDataPtr; // use as an array of 8 u. chars.
-
- // Initialize sprite's userData
- for(i=0; i<kNumberOfSprites; i++)
- {
- spriteDataPtr = (unsigned char *)(&gamePtr->spriteArray[i].userData);
- spriteDataPtr[kPreviousAction] = aJump;
- spriteDataPtr[kCurrentAction] = aJump;
- spriteDataPtr[kSpriteLife] = kSpriteMaxLife;
- spriteDataPtr[kSpriteBitData] = 0;
- switch(i)
- {
- case kPlayer1Sprite:
- spriteDataPtr[kSpriteIDNum] = gPlayer1Controller;
- break;
- case kPlayer2Sprite:
- spriteDataPtr[kSpriteIDNum] = gPlayer2Controller;
- break;
- case kPlayer1ProjectileSprite:
- spriteDataPtr[kSpriteIDNum] = kPlayer1ProjectileSprite;
- break;
- case kPlayer2ProjectileSprite:
- spriteDataPtr[kSpriteIDNum] = kPlayer2ProjectileSprite;
- break;
- default: // who cares???
- break;
- }
- }
-
- moveBoundsRect.bottom = gamePtr->spriteWorldP->windowFrameP->frameRect.bottom - 32;
- moveBoundsRect.top = gamePtr->spriteWorldP->windowFrameP->frameRect.top;
- moveBoundsRect.left = gamePtr->spriteWorldP->windowFrameP->frameRect.left;
- moveBoundsRect.right = gamePtr->spriteWorldP->windowFrameP->frameRect.right;
-
- gMoveDelta += 1;
- tempBoundsRect = moveBoundsRect;
- horizMoveDelta = gMoveDelta; //GetRandom(2, 6);
- vertMoveDelta = gMoveDelta; //GetRandom(2, 6);
-
- // calculate the movement boundary rectangle
- InsetRect(&tempBoundsRect, horizMoveDelta, vertMoveDelta);
- if (GetRandom(0, 1) == 1)
- horizMoveDelta = -horizMoveDelta;
-
- if (GetRandom(0, 1) == 1)
- vertMoveDelta = -vertMoveDelta;
-
- // set the player 1 & 2 sprite’s movement characteristics
- for(i=kPlayer1Sprite; i<=kPlayer2Sprite; i++)
- {
- SWSetSpriteMoveBounds(&gamePtr->spriteArray[i], &tempBoundsRect);
- SWSetSpriteMoveDelta(&gamePtr->spriteArray[i], horizMoveDelta, vertMoveDelta);
- SWSetSpriteMoveProc(&gamePtr->spriteArray[i], CombatMoveProc); //• mine
- // Maximum Speed!!!
- SWSetSpriteMoveTime(&gamePtr->spriteArray[i], 5*(20-gFrameAdvanceTime-1));
- SWSetSpriteFrameTime(&gamePtr->spriteArray[i], 5*(20-gFrameAdvanceTime-1));
- SWSetSpriteFrameRange(&gamePtr->spriteArray[i], 0, kNumberOfWarriorFrames - 1);
- SWSetSpriteFrameAdvance(&gamePtr->spriteArray[i], 1);
- // Default = CopyBits
- //SWSetSpriteDrawProc(&gamePtr->spriteArray[i], CompiledSpriteDrawProc); // Compiled Draw
- // Sprite Blitzkrieg!
- //SWSetSpriteDrawProc(&gamePtr->spriteArray[i], BlitPixieMaskDrawProc); // Blit
- // Collision procedure
- SWSetSpriteCollideProc(&gamePtr->spriteArray[i], CombatSpriteCollideProc); // mine
- // set the sprite’s initial location
- switch(i)
- {
- case kPlayer1Sprite:
- SWSetSpriteLocation(&gamePtr->spriteArray[i], 40, 40);
- break;
- case kPlayer2Sprite:
- SWSetSpriteLocation(&gamePtr->spriteArray[i], (640-128), 40);
- break;
- }
- }
-
- // set the player 1 & 2 projectile’s movement characteristics
- for(i=kPlayer1ProjectileSprite; i<=kPlayer2ProjectileSprite; i++)
- {
- // Reset some stuff
- spriteDataPtr = (unsigned char *)(&gamePtr->spriteArray[i].userData);
- spriteDataPtr[kPreviousAction] = aProjectileIdle;
- spriteDataPtr[kCurrentAction] = aProjectileIdle;
- spriteDataPtr[kSpriteLife] = kSpriteMaxLife;
- tempBoundsRect.right += 200;
- tempBoundsRect.left -= 200;
-
- SWSetSpriteMoveBounds(&gamePtr->spriteArray[i], &tempBoundsRect);
- SWSetSpriteMoveDelta(&gamePtr->spriteArray[i], 0, 0);
- SWSetSpriteMoveProc(&gamePtr->spriteArray[i], ProjectileMoveProc); //• mine
- // Maximum Speed!!!
- SWSetSpriteMoveTime(&gamePtr->spriteArray[i], 5*(20-gFrameAdvanceTime-1));
- SWSetSpriteFrameTime(&gamePtr->spriteArray[i], 5*(20-gFrameAdvanceTime-1));
- SWSetSpriteFrameRange(&gamePtr->spriteArray[i], 0, kNumberOfProjectileFrames - 1);
- SWSetSpriteFrameAdvance(&gamePtr->spriteArray[i], 1);
- // Invisible to start with
- SWSetSpriteVisible(&gamePtr->spriteArray[i], FALSE);
- // Collision procedure
- SWSetSpriteCollideProc(&gamePtr->spriteArray[i], CombatSpriteCollideProc); // mine
- // set the sprite’s initial location to zero (will update later when needed)
- SWSetSpriteLocation(&gamePtr->spriteArray[i], 300, 300);
- }
- }
-
- void SpriteFuneral(short theWinner)
- {
- PicHandle victPict;
- Rect victRect;
-
- victRect.top = victRect.left = 0;
- victRect.bottom = 78;
- victRect.right = 253;
- MyCenterRect(&victRect, &gWindowP->portRect);
-
- switch(theWinner)
- {
- case kPlayer1Sprite:
- victPict = GetPicture(kP1WinPICTResID);
- if(victPict == nil)
- DoError(kResError, TRUE);
- HLock((Handle)victPict);
- DrawPicture(victPict, &victRect);
- HUnlock((Handle)victPict);
- ReleaseResource((Handle)victPict);
- PlaySpriteMovie(gPlayer1File);
- break;
- case kComputer1Sprite:
- victPict = GetPicture(kComputerWinPICTResID);
- if(victPict == nil)
- DoError(kResError, TRUE);
- HLock((Handle)victPict);
- DrawPicture(victPict, &victRect);
- HUnlock((Handle)victPict);
- ReleaseResource((Handle)victPict);
- PlaySpriteMovie(gPlayer1File);
- break;
- case kPlayer2Sprite:
- victPict = GetPicture(kP2WinPICTResID);
- if(victPict == nil)
- DoError(kResError, TRUE);
- HLock((Handle)victPict);
- DrawPicture(victPict, &victRect);
- HUnlock((Handle)victPict);
- ReleaseResource((Handle)victPict);
- PlaySpriteMovie(gPlayer2File);
- break;
- case kComputer2Sprite:
- victPict = GetPicture(kComputerWinPICTResID);
- if(victPict == nil)
- DoError(kResError, TRUE);
- HLock((Handle)victPict);
- DrawPicture(victPict, &victRect);
- HUnlock((Handle)victPict);
- ReleaseResource((Handle)victPict);
- PlaySpriteMovie(gPlayer2File);
- break;
- default:
- SysBeep(30);
- break;
- }
- }
-
- short DetermineWinner(SpriteWorldPtr spriteWorldP)
- {
- unsigned char *data1Ptr, *data2Ptr, mostLifeForce=0, healthiestSprite;
-
- data1Ptr = (unsigned char *)(&spriteGame.spriteArray[kPlayer1Sprite].userData);
- data2Ptr = (unsigned char *)(&spriteGame.spriteArray[kPlayer2Sprite].userData);
- mostLifeForce = data1Ptr[kSpriteLife];
- if(data2Ptr[kSpriteLife] > mostLifeForce)
- healthiestSprite = data2Ptr[kSpriteIDNum];
- else
- healthiestSprite = data1Ptr[kSpriteIDNum];
- return healthiestSprite;
- }